#include "stm32f10x_usart.h"
#include "usart.h"

/*****************************************************
** @函数名：usart1_init
** @描述  ：无
** @参数  ：无
** @返回值：串口1，初始化
*****************************************************/
void usart1_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  //使能USART的时钟  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //使能GPIO复用的时钟
    //Usart1 NVIC 配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //选择中断分组
	
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_9;            //PA.9
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF_PP;	      //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_10;           //PA10
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN_FLOATING; //推挽输出
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化GPIOA.10  
	
	//485 DE定义
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_8;            //PA.8
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_Out_PP;	    
  GPIO_Init(GPIOA, &GPIO_InitStructure);     
  DE_L;  //485使能脚 平时保持低电平

	

  NVIC_InitStructure.NVIC_IRQChannel                   = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;           //抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 3;		        //子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;	    //IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);                                   	//根据指定的参数初始化VIC寄存器

	USART_InitStructure.USART_BaudRate            = 115200;                         //串口波特率
	USART_InitStructure.USART_WordLength          = USART_WordLength_8b;            //字长为8位数据格式
	USART_InitStructure.USART_StopBits            = USART_StopBits_1;               //一个停止位
	USART_InitStructure.USART_Parity              = USART_Parity_No;                //无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
	USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

    USART_Init(USART1, &USART_InitStructure);       //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //开启串口接收中断
    USART_Cmd(USART1, ENABLE);                      //使能串口1 
	
	USART1->SR&=~(1<<7);  //避免 stm32串口第一个字节发不出去
}

/*****************************************************
** @函数名：USART_OUT
** @描述  ：USART发送数据函数
** @参数  ：USART_TypeDef* USARTx：发送数据的串口号，unsigned char *Data：发送缓存地址，unsigned int Len：发送数据长度
** @返回值：None
*****************************************************/
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,uint16_t Len)
{ 
	uint16_t i;
	DE_H;
	for(i=0; i<Len; i++)
	{
		USART_SendData(USARTx, Data[i]);
		while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
	}
	DE_L;
}


/*****************************************************
** @函数名：USART1_IRQHandler
** @描述  ：串口1接收中断
** @参数  ：无
** @返回值：None
*****************************************************/
unsigned char recv_data;
void USART1_IRQHandler (void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {	 
		USART_ClearFlag(USART1,USART_FLAG_RXNE);
		recv_data = USART_ReceiveData(USART1);	//读取接收到的数据

  }		
}


